package com.cskaoyan._09static._03method;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/6 11:45
 **/
/*
1. 一个类中，静态方法无法直接调用非静态的方法和属性，
也不能使用this，super关键字（super后面会讲）,静态的方法只能访问静态的
  2. 经典错误：Non-static field/method xxx cannot be referenced from a static context
  3. 原因：静态方法调用的时候，完全有可能没有对象，没有对象普通成员就无法访问。

4. 普通成员方法当中，既可以访问静态成员的, 也可以访问非静态成员。普通成员方法访问任意的
5. 访问静态成员变量的时候，使用类名.变量名的形式访问，以示区别，增加代码可读性
 */
public class Demo2 {
    // 定义普通成员变量
    int a = 1;
    static int b = 2;

    public static void main(String[] args) {

    }

    // 定义普通成员方法
    public void normalMethod1() {
        // 访问非静态的成员
        System.out.println(a);
        System.out.println(this.a);
        normalMethod2();
        this.normalMethod2();

        // 访问静态的成员
        System.out.println(b);
        System.out.println(Demo2.b);
        staticMethod1();
        staticMethod2();
        Demo2.staticMethod2();
        // 在普通成员方法中,既可以访问非静态的,也可以访问静态的成员
        System.out.println("normalMethod1");
    }

    public void normalMethod2() {
        System.out.println("normalMethod2");
    }

    // 定义静态的成员方法
    public static void staticMethod1() {
        //访问非静态的属性(成员变量)
        // Non-static field 'a' cannot be referenced from a static context
        // System.out.println(a);
        // Non-static method 'normalMethod1()' cannot be referenced from a static context
        // normalMethod1();

        // 访问静态的成员
        System.out.println(Demo2.b);
        staticMethod2();
        Demo2.staticMethod2();

        // ---> 静态的方法只能访问静态的,不能访问非静态的.
        System.out.println("staticMethod1");
        // 不可以打印this
        // System.out.println(this);
    }

    public static void staticMethod2() {
        System.out.println("staticMethod2");
    }

}
